﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Data;

namespace prjMateriais
{
    public partial class frmProcessoTransferencia : FormProcessoPadrao.FormProcessoPadrao
    {

        bool firstClickMaterial;
        bool firstClickTipo;
        object tipoEstoque;
        string dataLoteOrigem;

        public frmProcessoTransferencia()
        {
            InitializeComponent();
            firstClickMaterial = true;
            firstClickTipo = true;
        }

        private void frmProcessoFracionamento_Load(object sender, EventArgs e)
        {
            pnlFimProcesso.Visible = false;
            tbcntrlEtapas.Visible = false;
            pnlFimProcesso.Dock = DockStyle.Fill;
            pnlInicio.Dock = DockStyle.Fill;
            insereTextoProcesso("de Transferência");
        }

        private void frmProcessoTransferencia_Shown(object sender, EventArgs e)
        {
            firtClickProximo = false;
            loadHistorico();
        }

        public override bool dadosValidos()
        {
            if (firtClickProximo)
            {
                if (cboMaterial.DataSource == null)
                {
                    MessageBox.Show("É necessário informar o material!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return false;
                }
            }
            else
            {
                firtClickProximo = true;
            }
            if (lblTipoEstoque.Text == cboTipoEstoque.Text)
            {
                MessageBox.Show("O tipo de estoque de destino não pode ser igual ao de origem!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
            if (lblLote.Text == txtLote.Text)
            {
                MessageBox.Show("O tipo de estoque de destino não pode ser igual ao de origem!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
            if (tbcntrlEtapas.SelectedIndex == 1 && txtLote.Text == "")
            {
                MessageBox.Show("É necessário informar o Novo Lote", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
            return true;
        }

        private void cboMaterial_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                string sql = SqlCrud.getInstance.select(ConstTabelas.LOTE, "CodigoMaterial = " + cboMaterial.SelectedValue);
                DataTable dt = Conexao.getInstance.executeQuery(sql);

                cboLote.DataSource = dt;
                cboLote.DisplayMember = "Nome";
                cboLote.ValueMember = ConstTabelas.LOTE_PK;

                loadInfoLoteOrigem();
            }
            catch
            { }
        }

        private void cboLote_SelectedIndexChanged(object sender, EventArgs e)
        {
            loadInfoLoteOrigem();
        }

        private void loadInfoLoteOrigem()
        {
            try
            {
                string sql = SqlCrud.getInstance.selectCampo(ConstTabelas.LOTE, "Codigo", "CodigoTipoEstoque, Quantidade, Data", cboLote.SelectedValue);
                DataTable dt = Conexao.getInstance.executeQuery(sql);
                lblQtd.Text = dt.Rows[0][1].ToString();
                txtQtd.Maximum = Convert.ToDecimal(dt.Rows[0][1]);
                dataLoteOrigem = Convert.ToDateTime(dt.Rows[0][2]).ToString(("MM/dd/yyyy"));

                tipoEstoque = dt.Rows[0][0];
                sql = SqlCrud.getInstance.selectCampo(ConstTabelas.TIPOESTOQUE, "Codigo", "Nome", tipoEstoque);
                dt = Conexao.getInstance.executeQuery(sql);
                lblTipoEstoque.Text = dt.Rows[0][0].ToString();

                lblLote.Text = cboLote.Text;
            }
            catch
            { }
        }

        private void cboMaterial_Click(object sender, EventArgs e)
        {
            if (firstClickMaterial)
            {
                loadCombos(ConstTabelas.MATERIAL, ConstTabelas.MATERIAL_PK, cboMaterial);
                firstClickMaterial = false;
            }
        }

        private void cboTipoEstoque_Click(object sender, EventArgs e)
        {
            if (firstClickTipo)
            {
                loadCombos(ConstTabelas.TIPOESTOQUE, ConstTabelas.TIPOESTOQUE_PK, cboTipoEstoque, false);
                firstClickTipo = false;
            }
        }

        private void saveLote()
        {
            campos = new List<string>();
            values = new List<Object>();

            campos.Add("Nome");
            campos.Add("CodigoTipoEstoque");
            campos.Add("CodigoMaterial");
            campos.Add("Quantidade");
            campos.Add("Data");

            values.Add(txtLote.Text);
            values.Add(cboTipoEstoque.SelectedValue);
            values.Add(cboMaterial.SelectedValue);
            values.Add(txtQtd.Text);
            values.Add(dataLoteOrigem);

            this.insert(ConstTabelas.LOTE, campos, values);
        }

        private void saveMovimentacao()
        {
            DataTable dt;
            string sql;
            campos.Clear();

            if (values == null) { values = new List<object>(); }

            values.Clear();

            campos.Add("Lote");
            campos.Add("Quantidade");
            campos.Add("TipoEstoque");
            campos.Add("TipoEstoqueDestino");
            campos.Add("Data");

            sql = SqlCrud.getInstance.selectCampo(ConstTabelas.LOTE, "Nome", ConstTabelas.LOTE_PK, txtLote.Text);
            dt = Conexao.getInstance.executeQuery(sql);
            var lote = dt.Rows[0][0];

            values.Add(lote);
            values.Add(txtQtd.Text);
            values.Add(tipoEstoque);
            values.Add(cboTipoEstoque.SelectedValue);
            values.Add(System.DateTime.Now.ToString(("MM/dd/yyyy")));

            if (cboHistorico.SelectedValue != null)
            {
                campos.Add("HistoricoMovimentacao");
                values.Add(cboHistorico.SelectedValue);
            }

            this.insert(ConstTabelas.MOVIMENTACOES, campos, values);
        }

        public void  loadHistorico()
        {
            try
            {
                string sql = SqlCrud.getInstance.select(ConstTabelas.HISTORICOMOVIMENTACAO, "Nome like '%transferencia%'");
                DataTable dt = Conexao.getInstance.executeQuery(sql);
                cboHistorico.DataSource = dt;
                cboHistorico.DisplayMember = "Nome";
                cboHistorico.ValueMember = ConstTabelas.HISTORICOMOVIMENTACAO_PK;
            }
            catch { }
        }

        private void updateLote()
        {
            campos = new List<string>();

            campos.Add("Quantidade = (Quantidade -" + int.Parse(txtQtd.Text) + ")");

            this.update(ConstTabelas.LOTE, campos, ConstTabelas.LOTE_PK, cboLote.SelectedValue);
        }

        public override bool metodo()
        {
            try
            {
                updateLote();
                saveLote();
                //Conexao.getInstance.CommitTransacao();
                saveMovimentacao();
               // Conexao.getInstance.CommitTransacao();
                return true;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Houve um erro na execução do processo! \n Verifique! \n" + ex.Message, "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

        }

        private void cboHistorico_SelectedIndexChanged(object sender, EventArgs e)
        {
        }

        private void cboHistorico_Click(object sender, EventArgs e)
        {
            
        }



        public bool firtClickProximo { get; set; }
    }
}
